/**
 * 结构化类型系统 是基于 完全的类型结构 来判断类型兼容性
 * 
 * 结构化类型系统的特性：
 * 如果两个不同名字的类型上，但是它们方法是一致的，仍然会被视为结构一致。
*/
class Cat {
    eat() { }
}
class Dog {
    eat() { }
}
function feedCat(cat: Cat) { }
feedCat(new Dog())

//1、如果为 Cat 类新增一个独特的方法，那么与Dog类结构就不一致了
class CatA {
    meow() { }
    eat() { }
}
class DogA {
    eat() { }
}
function feedCatA(cata: CatA) { }
// 报错！
feedCatA(new DogA())

//2、但如果为 Dog 类型添加一个独特方法呢？
//这个时候就没有类型报错了，
//这是因为，结构化类型系统认为 Dog 类型完全实现了 Cat 类型。
//至于额外的方法 bark，可以认为是 Dog 类型继承 Cat 类型后添加的新方法，
//即此时 Dog 类可以被认为是 Cat 类的子类。
class CatB {
    eat() { }
}
class DogB {
    bark() { }
    eat() { }
}
function feedCatB(catb: CatB) { }
feedCatB(new DogB())

//3、在比较 对象类型的属性 时，同样会采用结构化类型系统进行判断。
//而对结构中的函数类型（即方法）进行比较时，同样存在类型的兼容性比较
class CatC {
    eat(): boolean {
        return true
    }
}
class DogC {
    eat(): number {
        return 599;
    }
}
function feedCatC(catc: CatC) { }
// 报错！
feedCatC(new DogC())

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }